﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace TowerDefence
{
    public class Enemy : MonoBehaviour
    {
        [HideInInspector]
        public Animator anim; // 角色动画组件
        Rigidbody rb; // 刚体组件

        [Header("Health Stats")]
        public float maxHealth = 100; // 最大生命值
        private float currentHealth; // 当前生命值
        public GameObject healthBar; // 生命条对象
        public Image healthFill; // 生命条填充图像

        [Space]

        [Header("Movement speed")]
        [HideInInspector]
        public float speed; // 移动速度
        public float startSpeed = 3f; // 初始移动速度
        public float rotSpeed = 5f; // 旋转速度
        [HideInInspector]
        public float slowDuration; // 减速持续时间

        [Space]

        [Header("Combat Stats")]
        public Immunities immunity; // 免疫状态
        public int attackDamage = 1; // 攻击伤害
        public float armor; // 护甲值
        private float startArmor; // 初始护甲值
        public float magicResist; // 魔法抗性
        private float startMagicResist; // 初始魔法抗性
        public int goldValue = 10; // 金币价值

        [Header("Effects")]
        public ParticleSystem poisonEffect; // 中毒特效
        public GameObject deathEffect; // 死亡特效

        [Space]

        // Enemy Status
        [HideInInspector]
        public bool isPoisoned; // 是否中毒
        private bool applyCrit; // 是否应用暴击
        private float critRatio; // 暴击率
        [HideInInspector]
        public bool isDead; // 是否死亡

        [Header("是否应用代码内的放大比例")]
        public bool IsEnemyScale = true;
        private Vector3 EnemyScales=new Vector3(2f,2f,2f);//放大比例
        void Start()
        {
            if(IsEnemyScale)
            transform.localScale = EnemyScales;
            if (anim == null)
                anim = GetComponent<Animator>(); // 获取角色动画组件
            if (rb == null)
                rb = GetComponent<Rigidbody>(); // 获取刚体组件

            if (immunity != Immunities.毒)
                poisonEffect.gameObject.SetActive(false); // 如果不免疫中毒，则关闭中毒特效

            startArmor = armor; // 记录初始护甲值
            startMagicResist = magicResist; // 记录初始魔法抗性

            healthBar.SetActive(false); // 初始时隐藏生命条
            currentHealth = maxHealth; // 初始生命值为最大生命值
            speed = startSpeed; // 初始速度为起始速度
            isDead = false; // 初始状态为未死亡
        }

        public void ApplyEffects(Effect effect)
        {
            if (effect.effectType == EffectType.ArmorPenetration)
            {
                armor -= effect.effectValue; // 减少护甲值，用于穿透护甲效果
                if (armor <= 0)
                    armor = 0;
            }
            if (effect.effectType == EffectType.MagicPenetration)
            {
                magicResist -= effect.effectValue; // 减少魔法抗性，用于穿透魔法抗性效果
                if (magicResist <= 0)
                    magicResist = 0;
            }
            if (effect.effectType == EffectType.CriticalHitChance)
            {
                int randGen = Random.Range(0, 100);
                if (randGen <= effect.effectValue)
                {
                    applyCrit = true; // 根据暴击几率判断是否应用暴击
                }
            }
            if (effect.effectType == EffectType.CriticalHitDamage)
            {
                if (effect.effectValue <= 0) return;

                critRatio = effect.effectValue; // 设置暴击伤害比率
            }
            if (effect.effectType == EffectType.DamageOverTime)
            {
                TakeDamageOverTime(effect.effectValue, 1, effect.effectDuration);

                // 确保塔楼更改目标
                float totalDot = effect.effectValue * effect.effectDuration;
                if (totalDot >= currentHealth)
                {
                    isPoisoned = true; // 如果总毒性伤害大于等于当前生命值，则中毒状态为真
                }
            }
            if (effect.effectType == EffectType.Slow)
            {
                speed = startSpeed * (1f - effect.effectValue); // 减慢移动速度
            }
            if (effect.effectType == EffectType.SlowOverDuration)
            {
                speed = startSpeed * (1f - effect.effectValue); // 减慢移动速度
                slowDuration = effect.effectDuration; // 设置减速持续时间
            }
        }


        public void TakeDamage(float damage, DamageType damageType)
        {
            // 显示生命条
            if (!healthBar.activeSelf && !isDead)
                healthBar.SetActive(true);

            if (applyCrit)
            {
                applyCrit = false;
                damage *= critRatio; // 如果有暴击，应用暴击伤害
            }

            // 应用伤害
            if (damageType == DamageType.Magical)
            {
                damage -= magicResist; // 减少魔法抗性对伤害的影响
                if (damage <= 0)
                    damage = 0;

                currentHealth -= damage; // 减少当前生命值
            }
            else if (damageType == DamageType.Physical)
            {
                damage -= armor; // 减少护甲对伤害的影响
                if (damage <= 0)
                    damage = 0;

                currentHealth -= damage; // 减少当前生命值
            }
            else if (damageType == DamageType.True)
            {
                currentHealth -= damage; // 应用真实伤害，无视护甲和魔法抗性
            }

            // 在伤害扣除后重置护甲/魔法抗性
            armor = startArmor;
            magicResist = startMagicResist;

            // 更新生命值UI
            healthFill.fillAmount = currentHealth / maxHealth;

            // 敌人死亡
            if (currentHealth <= 0 && !isDead)
            {
                Die(); // 触发死亡事件
            }
        }


        public void TakeLaserDamage(float damage, DamageType damageType)
        {
            damage *= Time.deltaTime;
            // 显示生命条
            if (!healthBar.activeSelf && !isDead)
                healthBar.SetActive(true);

            if (applyCrit)
            {
                applyCrit = false;
                damage *= critRatio; // 如果有暴击，应用暴击伤害
            }

            // 应用伤害 
            if (damageType == DamageType.Magical)
            {
                damage -= magicResist * Time.deltaTime; // 减少魔法抗性对伤害的影响
                if (damage <= 0)
                    damage = 0;

                currentHealth -= damage; // 减少当前生命值
            }
            else if (damageType == DamageType.Physical)
            {
                damage -= armor * Time.deltaTime; // 减少护甲对伤害的影响
                if (damage <= 0)
                    damage = 0;

                currentHealth -= damage; // 减少当前生命值
            }
            else if (damageType == DamageType.True)
            {
                currentHealth -= damage; // 应用真实伤害，无视护甲和魔法抗性
            }

            // 在伤害扣除后重置护甲/魔法抗性
            armor = startArmor;
            magicResist = startMagicResist;

            // 更新生命值UI
            healthFill.fillAmount = currentHealth / maxHealth;

            // 敌人死亡
            if (currentHealth <= 0 && !isDead)
            {
                Die(); // 触发死亡事件
            }
        }

        public void TakeDamageOverTime(float damage, float rate = 1, float duration = 1)
        {
            StartCoroutine(DamageOverTime(damage, rate, duration)); // 启动持续伤害的协程
        }

        IEnumerator DamageOverTime(float damage, float rate, float duration)
        {
            float t = 0; // 计时器

            while (t < duration)
            {
                currentHealth -= damage; // 减少生命值
                healthFill.fillAmount = currentHealth / maxHealth; // 更新生命值UI显示
                t += 1; // 增加计时器

                poisonEffect.gameObject.SetActive(true); // 激活中毒特效对象
                poisonEffect.Play(); // 播放中毒特效动画

                if (currentHealth <= 0 & !isDead)
                {
                    poisonEffect.Stop(); // 停止中毒特效
                    Die(); // 触发死亡事件
                    yield break; // 退出协程
                }
                yield return new WaitForSeconds(rate); // 等待指定时间间隔
            }
        }

        void Die()
        {
            anim.SetBool(StringData.death, true); // 设置死亡动画参数
            PlayerStats.Gold += goldValue; // 增加玩家金币
            healthBar.SetActive(false); // 隐藏生命条UI
            isDead = true; // 设置死亡状态

            // 添加死亡效果

            WaveManager.EnemiesAlive--; // 减少存活敌人数量

            Destroy(gameObject, 5f); // 在延迟后销毁游戏对象
        }

    }
}